<?php
/*
Copyright (C) 2009 de Flotte Maxence

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
?>
<?php
/**
 * @author de Flotte Maxence <xamax87@gmail.com>
 * @package std
 * @version 1.0
 */
/**
 * Classe mère de tous les objets puZZle
 * @package std
 */
class Bout {
/**
 * @var string nom de l'objet
 */
	protected $name;
/**
 * @var array liste des objets apartenant à l'objet lui même
 */
	protected $_Object;
/**
 * @var string code html, fourni par la méthode buildStatic
 */
	protected $codeBuilt;
/**
 * @var string
 */
	protected $inner;
/**
 * @var string
 */
	protected $_arg = null;
/**
 * @var string
 */
	protected $_Flux;
/**
 * @var string url du fichier php
 */
	protected $url = 'std/boot.php';
/**
 * @var string nom de la classe
 */
	protected $bootName = 'Boot';
/**
 * @var page pointer vers l'objet page
 */
	public $page = null;
/**
 * @var bool l'objet est-il statique (ne sert plus à rien ?)
 */
	public $isStatic = false;
/**
 * @var string liste de seter à retenir lors de la mise en cache d'un objet dynamique
 */
	private $_autoSet;
/**
 * @var array liste des variables de configuration
 */
	protected $_conf = array();
/**
 * @var string nom du fichier de configuration
 */
	protected $confFileName;
/**
 * @var bool la méthode Me a elle était déjà utilisée ?
 */
	protected $isMeWasUsed = false;
	protected $IO = null;

/**
 * Constructeur
 * @param int $name nom de l'objet puZZle
 * @param PAGE $page pointeur vers l'objet PAGE
 */
	public function __construct($name,$page,$className) {
		$this->name = $name;
		$this->page = $page;
		$this->url = str_replace('_','/',strToLower($className)).'.php';
		$this->bootName = $className;
		if(method_exists($this,'construct'))
			$this->construct();
	}
/**
 * Ajoute les codes html de retour d'un objet puZZle dans lui-même
 * @param string $Inner retour de l'autre objet
 */
	public function sendObjBuiltIntoInner($Inner) {
		$this->inner .= $Inner."\n";
	}
/**
 * Definit le contenu de l'inner le l'objet
 * @param string $inner code html
 */
	public function setInner($inner) {
		$this->inner = $inner;
	}
/**
 * Ajoute un flux
 * @param string $flux nom du flux
 * @param string $Type type du flux
 */
	public function addFlux($Flux, $Type) {
		$this->_Flux[] = array('flux' => $Flux,'type' => $Type);
	}
/**
 * Ajoute un objet dans l'une des propriètés de l'objet
 * @param string $Var nom de la propriétè
 * @param Bout $Obj poiteur sur l'objet
 */
	public function AddObject2($Var,$Obj) {
		if ($this->_Object[$Var] == NULL)
			$this->_Object[$Var][] = $Obj; 
		if(!in_array($Obj,$this->_Object[$Var]))
			$this->_Object[$Var][] = $Obj;
	}
/**
 * Rapporte une erreur, et empéche la mise en cache
 * @param string $msg message à enregister dans le rapport d'erreur
 */
	protected function reportError($msg = null) {
		if($this->page != null)
			$this->page->noCache = true;
		$file = fopen('./Log/errors.log','a+');
		fwrite($file,date('d/m/Y H/i/s').' : '.$_SERVER['REQUEST_URI'].' : '.$_SERVER['HTTP_REFERER'].' : '.$msg."\n");
		fclose($file);
	}
/**
 * Calcule le resultat des objets contenus dans $this->_Object
 */
	public function buildListObject() {
		/*foreach($this As $key => $value) {
			$nkey = N.$key;
			$this->nkey = $this->$key;
		 }*/
		if ($this->_Object != NULL) {
			foreach($this->_Object	as $key => $array) {
	$methode = 'sendObjBuiltInto'.$key;
	//$nkey = N.$key;
	//$this->$key = $this->$nkey;
	foreach($array as $i => $value) {
		$this->$key .= $this->$methode($value->buildBout());
	}
			}
		}
	}
/**
 * Calcule le resultat statique des objets contenus dans $this->_Object
 */
	public function buildStaticListObject() {
		/*foreach($this As $key => $value) {
			$nkey = N.$key;
			$this->nkey = $this->$key;
		 }*/
		if ($this->_Object != NULL) {

			foreach($this->_Object	as $key => $array) {
	$methode = 'sendObjBuiltInto'.$key;
	//$nkey = N.$key;
	//$this->$key = $this->$nkey;
				foreach($array as $i => $value) {
					$this->$key .= $this->$methode($value->buildStaticBout());
				}
			}
		}
	}
/**
 * Calcule le resultat de notre objet
 */
	public function buildBout() {
		if(isset($this->codeBuilt))
			return $this->codeBuilt;
		else {
			//$this->readFlux;
			$this->buildListObject();
			return $this->codeBuilt = '<div id="'.$this->name.'" >'.$this->build().'</div>';
		}
	}
/**
 * Calcule le resultat statique de notre objet
 */
	public function buildStaticBout() {
		if(isset($this->codeBuilt))
			return $this->codeBuilt;
		else {
			//$this->readFlux;
			$this->buildStaticListObject();

		/*//Récupération des paramètre
			foreach($this as $key => $value)
	if ($key != 'page' and $key != '_Object' and $key != '_Flux' and $key != 'codeBuilt' and $key != 'isStatic' and $key != 'name' and $key != 'url')
		$arg .= '&set'.$key.'='.$value;*/
		if(method_exists($this,'buildStatic'))
			return $this->codeBuilt = '<div id="'.$this->name.'" obj="'.$this->url.'" >'.$this->buildStatic().$this->Me().'</div>';
		else
			return $this->codeBuilt = '<div id="'.$this->name.'" obj="'.$this->url.'" >'.$this->build().'</div>';
		}
	}
/**
 * Definition de buidStatic(), retourne le resultat de build()
 * @return string
 */
	/*public function buildStatic() {
		$this->isStatic = true;
		return $this->build($this);
	}*/

/**
 * Ouverture du fichier de configuration
 * @return void
 */
	protected function openConfFile() {
		if(empty($this->confFileName))
			$this->setConfFile($this->bootName);
		if(!file_exists('./ZzConf/'.$this->confFileName))
			return false;
		$confFile = file_get_contents('./ZzConf/'.$this->confFileName);
		$this->_conf = unserialize($confFile);
		return true;
	}
	
/**
 * Sauvegarde du fichier de configuration
 * @return void
 */
	protected function saveConfFile() {
		if(empty($this->confFileName))
			$this->setConfFile($this->bootName);
		$confFile = serialize($this->_conf);
		file_put_contents('./ZzConf/'.$this->confFileName,$confFile);
	}
	
/**
 * Définition du fichier de configuration
 * @return void
 */
	public function setConfFile($confFileName) {
		$this->confFileName = strToLower($confFileName).'.conf.php';
	}
	

	//Interprétation des évènement
	protected function event($obj,$action) {
		return 'reLoadBoot(\''.$obj.'\',\''.$action.'\');';
	}

	protected function addArgument($arg) {
		if($this->page ==null and $this->_arg==null)
			$this->onEvent();
		$this->_arg .= '&set'.$arg.'='.$this->$arg;
	}
	protected function writeArgument() {


		return '<arg arg="'.$this->_arg.'"/>';
	}
	//protected function addArgument($obj,$action) {
//
	//return 'reLoadBoot(\''.$obj.'\',\''.$action.'\');';

 // }
	//Interprétation des évènement
	protected function addListener($e,$declencheur,$action,$obj) {

//Execution de la fonction
		if($this->page == null)
			$this->$action();

//Récupération des paramètre
		foreach($this as $key => $value)
			if ($key != 'page' and $key != '_Object' and $key != '_Flux' and $key != 'codeBuilt' and $key != 'isStatic' and $key != 'name' and $key != 'url')
				$arg .= '&set'.$key.'='.$value;

//Action
		$arg = 'reLoad(\''.$this->name.'\',\''.$arg.'\');';
//Ajout du déclancheur
		return '<script type="text/javascript">
		<!--
		alert("rr");
		addDeclencheur("'.$obj.'","'.$e.'","'.$arg.'");
		alert("rr");
		//-->
		</script>';

		/*if($e == 'onClick') {
			return 'onClick="reLoad(\''.$this->name.'\',\''.$arg.'\');"';
		}
		elseif($e == 'onFocus') {
			return 'onFocus="reLoad(\''.$this->name.'\',\''.$arg.'\');"';
		}
		elseif($e == 'onChange') {
			return 'onChange="reLoad(\''.$this->name.'\',\''.$arg.'\');"';
		}
		elseif($e == 'onMouseOver') {
			return 'onMouseOver="reLoad(\''.$this->name.'\',\''.$arg.'\');"';
		}*/

	}

/**
 * Recupèrer une instance de la classe ZzIO
 */
	function getIO() {
		if(!isSet($GLOBALS['IO']))
			 $GLOBALS['IO'] =  new ZzIO();
		return  $GLOBALS['IO'];
	}
	
/**
 * Rend dynamique un objet
 * @return string
 */
	//Me :: permet de rendre dynamique un objet
	function Me() {
		if($this->isMeWasUsed)
			return null;
		//Me viens d'être utilisée
			$this->isMeWasUsed = true;
			
		$autoSet = null;
		if(isSet($this->_autoSet))
			foreach($this->_autoSet as $arg) {
				$autoSet .= '	$'.$this->name.'->set'.$arg.'(\''.$this->$arg.'\')'.";\n";
			}
		else
			$autoSet = null;

		return "
<?php
	include_once './ZzO/std/Boot.php';
	include_once './ZzO/$this->url';
	$$this->name = new $this->bootName('$this->name', null, '$this->bootName');
$autoSet
	echo $$this->name->build();
?>";

	}
/**
 * Enregistre la propriété $arg d'un l'objet dynamique dans la cache
 * @param string $arg paramètre
 * @return void
 */
	//AutoSet
	protected function addAutoSet($arg) {
		$this->_autoSet[] = $arg;
	}
	
/**
 * Ouvre une pièce en tant que pièce dynamique
 * @param string $class nom de la classe
 * @return string
 */
	protected function openBout($class) {
		$url = strToLower(str_replace('_','/',$class)).'.php';
		return '
	<?php
		include_once "./ZzO/std/Boot.php";
		include_once "./ZzO/'.$url.'";
		$obj = new '.$class.'(\'noname\',null,\''.$class.'\');
		echo $obj->build();
	?>';
	}

	protected function reLoad() {

	}
	
	
}

/**
 * Recacule l'url avac des nouvelle variables get
 * @param string $gKey variable get
 * @param string $gVal valeur de la variable
 * @return string
 */
function getUrl($gKey = null,$gVal = null) {
	$url = '?';
	if(isset($_GET[$gKey])) {
		$_GET[$gKey] = $gVal;
		$gKey = null;
	}
	foreach($_GET As $key => $val)
		$url .= $key.'='.$val.'&';
	if($gKey != null) {
		$url .= $gKey.'='.$gVal;
	}
	return $url;
}

/**
 * Recacule l'url d'un label enfant
 * @param string $arg l'identifiant du label enfant
 * @param bool $altPuZZle Si on veux le puzzle alternatif
 * @return string
 */
function getChildUrl($arg,$altPuZZle = false) {
	if($altPuZZle)
		return './?label='.$arg.'-'.$_GET['label'].'&altPuZZle';
	else
		return './?label='.$arg.'-'.$_GET['label'];
}

/**
 * Recacule l'url du label parent
 * @param bool $altPuZZle Si on veux le puzzle alternatif
 * @return string
 */
function getParentUrl($altPuZZle = false) {
		$_labels = explode($_GET['label']);
		$url = '';
		for($i = 1; $i<count($_labels)-1;$i++)
			$url .= $_labels[$i].'-';
		$url .= $_labels[count($_labels)];
		if($altPuZZle)
			$url .= '&altPuZZle';
		return './?label='.$url;
}

/**
 * Retourne l'url du puzzle alternatif si puzzle normal, et l'inverse dans le cas contraire
 * @return string
 */
function getTheOtherPuZZle() {
	if(isset($_GET['altPuZZle']))
		if($_GET['altPuZZle'] == 'true')
			return './?label='.$_GET['label'];
	return './?label='.$_GET['label'].'&altPuZZle';
}

/**
 * Permet de traduire des expressions à partir d'un dictionnaire
 */
class ZzTranslation {
	private $_tranlation;
	private $file;
	private $obj;
/**
 * Constructeur
 * @param string $file Nom du dictionnaire
 * @param Bout $obj pointeur vers l'objet appelant
 * @return void
 */
	public function __construct($file,$obj = null) {
		$this->file = $file;
		$this->obj = $obj;
		//if(isset($_SESSION['ZzLang_'.$file]) or $obj->isStatic) {
		//	$this->_translation = $_SESSION['ZzLang_'.$file];
		//}
		//else {
		if(!isSet($GLOBALS['translation_'.$file])) {
			if(!isSet($_SESSION['lang'])) 
				$_SESSION['lang'] = 'default';

			if(file_exists ($GLOBALS['cwd'].'/ZzT/'.$file.'_'.$_SESSION['lang'].'.lang')) {
				$File = $file.'_'.$_SESSION['lang'].'.lang';
				$_GET['lang'] = $_SESSION['lang'];
			}
			else {
				$File = $file.'_default.lang';
			}
			$dico = file_get_contents($GLOBALS['cwd'].'/ZzT/'.$File);
			foreach(explode("\n",$dico) as $key => $line) {
				$line = explode('|',$line);
				$this->_translation[$line[0]][] = preg_replace('!\(.*\)!','()',$line[1]);
				$this->_translation[$line[0]][] = explode(',', preg_replace('!^.*\((.*)\).*$!','$1',$line[1]));
			}
			$GLOBALS['translation_'.$file] = $this->_translation;
		}
		else {
			$this->_translation = $GLOBALS['translation_'.$file];
		}
	//$_SESSION['ZzLang_'.$file] = $this->_translation;
	 //	 }
	}
/**
 * Traduit une expression
 * @param string $str Expression à traduire
 * @param int $option nombre d'élément
 * @return string
 */
	public function tr($str,$option = 0) {
		if(isSet($this->_translation[$str])) {
			$_option = $this->_translation[$str][1];
			if($option < sizeof($_option)-1)
				$option = $_option[$option];
			else
				$option = $_option[sizeof($_option)-1];
			return str_replace('()',$option,$this->_translation[$str][0]);
		}
		else
			return $str;
	}
}

/**
 * Recupère les identifiants des labels
 * @param string|int $lvl profondeur du label
 */
function ZzGetLabel($lvl = null) {
	//On récupère la valeur les label dans un tableau
	$_label = explode('-',$_GET['label']);

	if($lvl == null)
		return $_label[0];
	elseif($lvl == 'last')
		return @$_label[1];
	elseif(is_numeric($lvl))
		return @$_label[$lvl];
	else
		return 'ERROR_LVL';
}
/**
 * Met à jours la cache du label
 */
function ZzUpLabel() {
	$label = ZzGetLabel();
	include './ZzL/manageLabel.php';
	ZzUpdateLabel($label,null,null,null);
}
/**
 * Met à jours la cache du précédant
 */
function ZzUpLastLabel() {
	$label = ZzGetLabel('last');
	if($label != null) {
		include './ZzL/manageLabel.php';
		ZzUpdateLabel($label,null,null,null);
	}
}
/**
 * Recupère l'identifiant du propriétaire du label
 * @return int
 */
//ZzGetUser:: permet de récuperer l'utilisateur propriétaire du label
function ZzGetUser() {
	return $GLOBALS['label_user'];
}
/**
 * Recupère l'identifiant du groupe propriétaire du label
 * @return int
 */
//ZzGetUser:: permet de récuperer le groupe propriétaire du label
function ZzGetGroup() {
	return $GLOBALS['label_group'];
}

/**
 * Gestion des entrés/sorties
 * Récupère et stoque des données sur la base de données
 */
 
class ZzIO {
	
	private $domain;
	private $tableName;
	private $_needs = array();
	private $_responces = array();
	private $id;
	private $domainName;
	private $_labelDomTypes = array();
	private $mysql;
	private $queryWasExecuted = false;
	private $tr;
	private $trDom;
	private $nbChildsPerPage = 10;
	private $previewButton = false;
	private $childsOrder = 'ASC';
	private $childsOrderBy = 'dateC';
	private $createChilds = array();
	private $_autocreateChildsPermissions = null;
	private $_parentsToAdd = array();
	private $_parentsToUnlink = array();
	
	
	public function __construct($id = null) {
		//Objet mysqli
		$this->mysql = $GLOBALS['MySql'];
		//le dictionnaire
		$this->tr = new ZzTranslation('dom_errors');
		$this->trDom = new ZzTranslation('dom_labels');
		//Si $id non null alors, on doit récupérer les info depuis la base de donnée
		if(!empty($id) and is_numeric($id)) {
			$this->id = $id;
			$query = 'SELECT name, dateC, dateU, user, `group`, type, userR, userW, groupR, groupW, otherR, otherW FROM '.$GLOBALS['prefix'].'label WHERE id = '.$this->id;
			$resultQuery = $this->mysql->query($query);
			if($_res = $resultQuery->fetch_assoc()) {
				$name = $_res['name'];
				$dateC = $_res['dateC'];
				$dateU = $_res['dateU'];
				$user = $_res['user'];
				$group = $_res['group'];
				$type = $_res['type'];
				$chmod = $_res['userR'].','.$_res['userW'].','.$_res['groupR'].','.$_res['groupW'].','.$_res['otherR'].','.$_res['otherW'];

				//On récupère les labels parents
					$parentLabel = array();
					$query = 'SELECT id_father FROM '.$GLOBALS['prefix'].'_label WHERE id_son = '.$this->id;
					$resultQuery = $this->mysql->query($query);
					while($_res = $resultQuery->fetch_assoc())
						$parentLabel[] = $_res['id_father'];
			}
		}
		//Si un identifiant est inconnu alors c'est un nouvel enregistrement
		elseif(empty($GLOBALS['label_id'])) {
			//C'est un enrgistrement nouvellement créé
			if(!empty($_SESSION['tmpId'.$GLOBALS['tmpId']]))
				$this->id = $_SESSION['tmpId'.$GLOBALS['tmpId']];
			//C'est un nouvel enregistrement
			else 
				$this->id = null;
				
			$name = '';
			$dateC = time();
			$dateU = time();
			$user = empty($_SESSION['user'])?1:$_SESSION['user'];
			$group = empty($_SESSION['group'][0])?1:$_SESSION['group'][0];
			$type = $GLOBALS['label_type'];
			$chmod = '1,1,1,0,1,0';
			$parentLabel = ZzGetLabel('last');
		}
		//C'est un enregistrement existant
		else {
			$this->id = @$GLOBALS['label_id'];
			$name = @$GLOBALS['label_name'];
			$dateC = @$GLOBALS['label_dateC'];
			$dateU = @$GLOBALS['label_dateU'];
			$user = @$GLOBALS['label_user'];
			$group = @$GLOBALS['label_group'];
			$type = @$GLOBALS['label_type'];
			$chmod = @$GLOBALS["label_userR"].','.@$GLOBALS["label_userW"].','.@$GLOBALS["label_groupR"].','.@$GLOBALS["label_groupW"].','.@$GLOBALS["label_otherR"].','.@$GLOBALS["label_otherW"];
			//On récupère les labels parents
				$parentLabel = array();
				$query = 'SELECT id_father FROM '.$GLOBALS['prefix'].'_label WHERE id_son = '.$this->id;
				$resultQuery = $this->mysql->query($query);
				while($_res = $resultQuery->fetch_assoc())
					$parentLabel[] = $_res['id_father'];
		}
		//Declaration des champs du label
		include_once './ZzDom/ZzDomType/domtypelabel.php';
		include_once './ZzDom/ZzDomType/domtypestring.php';
		include_once './ZzDom/ZzDomType/domtypelabeldate.php';
		include_once './ZzDom/ZzDomType/domtypelabeluser.php';
		$this->_labelDomTypes['id'] = new DomTypeLabel('id',$this->trDom->tr('identifiant'));
		$this->_labelDomTypes['name'] = new DomTypeString('name',$this->trDom->tr('nom'));
		$this->_labelDomTypes['dateC'] = new DomTypeLabelDate('dateC',$this->trDom->tr('date de création'));
		$this->_labelDomTypes['dateU'] = new DomTypeLabelDate('dateU', $this->trDom->tr('date de modification'));
		$this->_labelDomTypes['user'] = new DomTypeLabelUser('user', $this->trDom->tr('utilisateur'));
		$this->_labelDomTypes['group'] = new DomTypeLabel('group', $this->trDom->tr('groupe'));
		$this->_labelDomTypes['type'] = new DomTypeLabel('type', $this->trDom->tr('type'));
		$this->_labelDomTypes['chmod'] = new DomTypeLabel('chmod',$this->trDom->tr('chmod'));
		$this->_labelDomTypes['parentLabel'] = new DomTypeLabel('parentLabel',$this->trDom->tr('Label parent'));
		$this->_labelDomTypes['name']->setNotNullable();
		$this->_labelDomTypes['id']->setValue($this->id);
		$this->_labelDomTypes['name']->setValue($name);
		$this->_labelDomTypes['dateC']->setValue($dateC);
		$this->_labelDomTypes['dateU']->setValue($dateU);
		$this->_labelDomTypes['user']->setValue($user);
		$this->_labelDomTypes['group']->setValue($group);
		$this->_labelDomTypes['type']->setValue($type);
		$this->_labelDomTypes['parentLabel']->value = $parentLabel;
		$this->_labelDomTypes['chmod']->setValue($chmod);
		
		$this->domainName = 'Dom'.$type;
		$this->tableName = $GLOBALS['prefix'].strToLower($type);
		include_once './ZzDom/'.strToLower('dom'.$type).'.php';
		$this->domain = new $this->domainName();
	}
	
	/**
	 * Definie les champs nécéssaires. Cet élément est optionnel pour la lecture, mais vital pour l'écriture
	 */
	public function need($arg) {
		if(!in_array($arg,$this->_needs)) {
			$this->_needs[] = $arg;
			$this->queryWasExecuted = false;
		}
	}
		
	/**
	 * Definie les champs qui ne sont plus nécéssaires.
	 */
	public function dontNeed($arg) {
		if(in_array($arg,$this->_needs)) {
			$key = array_search($arg, $this->_needs);
			unSet($this->_needs[$key]);
		}
	}
	
	/**
	 * Effectue la requête SQL dans le but de collecter les données
	 * @return bool return true en cas de réussite, false dans le cas contraire
	 */
	private function execQuery() {
		// Si la requête a déjà été executée
		if($this->queryWasExecuted)
			return null;
		$this->queryWasExecuted = true;

		$nbArgs = 0;
		$query = 'SELECT ';
		$resp = 2;
		$first = true;
		foreach($this->_needs as $val) {
			if(!in_array($val,array('name','dateC','dateU','user','group','type','id'))) {
				if($first)
					$first = false;
				else
					$query .= ', ';
				$query .= '`'.$val.'` ';
				$nbArgs++;
			}
		}
		
		$query .= 'FROM `'.$this->tableName.'` WHERE id = '.$this->id;
		if($this->id != null)  {
			if($nbArgs > 0)
				if($query = $this->mysql->query($query))
					$_data = $query->fetch_assoc();
			foreach($this->_needs as $val) {
				if(isSet($_POST[$val]))
					$this->_responces[$val] = $_POST[$val];
				elseif(!in_array($val,array('name','dateC','dateU','user','group','type','id')) and $nbArgs > 0)
					$this->_responces[$val] = $_data[$val];
				else
					$this->_responces[$val] = $this->_labelDomTypes[$val]->value;
				
				//On ajoute les value aux entités
				if(!in_array($val,array('name','dateC','dateU','user','group','type','id')))
					$this->domain->$val->setValue($this->_responces[$val]);
				//else
				//	$this->_labelDomTypes[$val]->setValue($this->_responces[$val]);
			}
		}
		else {
			foreach($this->_needs as $val) {
				if(isSet($_POST[$val]))
					$this->_responces[$val] = $_POST[$val];
				else
					$this->_responces[$val] = '';
			}
		}
	}
	
	/**
	 * Recupère un champs domType
	 * @return DomType
	 */
	public function get($val) {
		
		
		$this->need($val);
		$this->execQuery();
		//Si c'est un champs de ZzLabel
		if(in_array($val,array('name','dateC','dateU','user','group','type','id'))) {
			
			/*echo $val.'t';
			var_dump($this->_needs);
			$this->execQuery();*/
			return $this->_labelDomTypes[$val];
		}
		else {
			//if(!isset($this->_responces[$val])) {
			
			//}
			$this->domain->$val->setValue(@$this->_responces[$val]);
			return $this->domain->$val;
		}
	}
	
	/**
	 * Recuperer le formulaire
	 * @return string
	 */
	public function getForm() {
		$this->isNotCommitable(); 
		
		$form = '<form method="post" id="IOForm'.$this->id.'" class="IOForm'.$this->domainName.' IOForm">
	<input type="hidden" value="'.$GLOBALS['tmpId'].'" name="tmpId"/>
';
		foreach($this->_needs as $key) {
			if(!isset($this->_responces[$key]))
				$this->execQuery();
				
			//On récupère les erreurs éventuels
				if(!empty($GLOBALS['errors'][$key])) {
					$formError = '<span class="error">'.$GLOBALS['errors'][$key].'</span>';
					$class = 'IOFormEltWithError';
				}
				else {
					$formError = '';
					$class = 'IOFormElt';
				}
				
			if(in_array($key,array('name','dateC','dateU','user','group','type','id'))) {
				$this->_labelDomTypes[$key]->setValue(@$this->_responces[$key]);
				
				$form .= '	<div class="'.$class.'">';
				$form .= $this->_labelDomTypes[$key]->in().$formError.'</div>
';
			}
			else {
				$this->domain->$key->setValue(@$this->_responces[$key]);
				$form .= '	<div class="IOFormElt">';
				$form .= $this->domain->$key->in().$formError.'</div>
';
			}
			
		}
		
		//Bouton d'aperçu ?
		$button = '';
		if($this->previewButton)
			$button = '<input type="submit" name="IOFormView'.$this->id.'" value="aperçu"/>';
	
		$form .= '
	<div class="IOFormSubmit">
		<input type="submit" name="IOForm'.$this->id.'"/>'.$button.'
	</div>
</form>
';
		return $form;
	}
	
	/**
	 * Affiche le boutton d'apperçu dans le formulaire
	 */
	public function enablePreviewButton() {
		$this->previewButton = true;
	}
	
	/**
	 * informe si clic sur aperçu
	 */
	public function isPreview() {
		if(isSet($_POST['IOFormView'.$this->id]))
			return true;
		return false;
	}
	
	/**
	 * récupérer les informations du label
	 * @return string
	 */
	public function getValue() {
		$div = '<div id="IOForm'.$this->id.' IOForm'.$this->domainName.'">
';
		foreach($this->_needs as $key) {
			if(!isset($this->_responces[$key]))
				$this->execQuery();
			if(in_array($key,array('name','dateC','dateU','user','group','type','id'))) {
				$this->_labelDomTypes[$key]->setValue(@$this->_responces[$key]);
				$div .= $this->_labelDomTypes[$key]->out().'<br />
';
			}
			else {
				$this->domain->$key->setValue($this->_responces[$key]);
				$div .= $this->domain->$key->out().'<br />
';
			}
		}
		$div .= '</div>
';
		return $div;
	}
	
	/**
	 * récupérer les enfant du label
	 * @return array
	 */
	public function getAllChilds($type = null) {
		$_childs = array(); //liste des enfants
		

		//Construction du critère de limitation des droit
			//Si statique, seul les enfants avec droit en lectures pour tous
			if($GLOBALS['isStatic'])
				$rightCriteria = ' AND otherR = 1';
			//Si dynamique 
			else {
				if(!empty($_SESSION['group']))
					foreach($_SESSION['group'] AS $key => $grp)
						if($key == 0)
							$listGroup = $grp;
						else
							$listGroup .= '|'.$grp;
				else
					$listGroup = '0';
				if(!empty($_SESSION['user']))
					$user = $_SESSION['user'];
				else
					$user = '0';
				$rightCriteria = ' AND ((OtherR=1) OR (GroupR = 1 AND Group REGEXP \'^'.$listGroup.'$\') OR (UserR = 1 AND User = '.$user.')';
			}
		
		//Si $type est null, on récupère tout les enfants
		if($type == null)
			$query = 'SELECT id_son FROM '.$GLOBALS['prefix'].'_label inner join '.$GLOBALS['prefix'].'label on id = id_son WHERE id_father = '.$this->id.$rightCriteria.' ORDER BY '.$this->childsOrderBy.' '.$this->childsOrder;
		else
			$query = 'SELECT id_son FROM '.$GLOBALS['prefix'].'_label inner join '.$GLOBALS['prefix'].'label on id = id_son WHERE `type` = "'.$type.'" AND id_father = '.$this->id.$rightCriteria.' ORDER BY '.$this->childsOrderBy.' '.$this->childsOrder;
		if($resultQuery = $this->mysql->query($query))
			while($res = $resultQuery->fetch_assoc()) {
				$_childs[] = new ZzIO($res['id_son']);
			}
		return $_childs;
	}
	/**
	 * récupérer les enfant du label
	 * @return array
	 */
	public function getChilds($type = null) {
		$_childs = array(); //liste des enfants
		
		//Numéro de la page
			$page = 0;
			if(!empty($_GET['page']) > 0)
				$page = intval($_GET['page']);

		//Construction du critère de limitation des droit
			//Si statique, seul les enfants avec droit en lectures pour tous
			if($GLOBALS['isStatic'])
				$rightCriteria = ' AND otherR = 1';
			//Si dynamique 
			else {
				if(!empty($_SESSION['group']))
					foreach($_SESSION['group'] AS $key => $grp)
						if($key == 0)
							$listGroup = $grp;
						else
							$listGroup .= '|'.$grp;
				else
					$listGroup = '0';
				if(!empty($_SESSION['user']))
					$user = $_SESSION['user'];
				else
					$user = '0';
				$rightCriteria = ' AND ((OtherR=1) OR (GroupR = 1 AND Group REGEXP \'^'.$listGroup.'$\') OR (UserR = 1 AND User = '.$user.')';
			}

		//Si $type est null, on récupère tout les enfants
		if($type == null)
			$query = 'SELECT id_son FROM '.$GLOBALS['prefix'].'_label inner join '.$GLOBALS['prefix'].'label on id = id_son WHERE id_father = '.$this->id.$rightCriteria.' ORDER BY '.$this->childsOrderBy.' '.$this->childsOrder.' LIMIT '.($page*$this->nbChildsPerPage).','.$this->nbChildsPerPage.';';
		else
			$query = 'SELECT id_son FROM '.$GLOBALS['prefix'].'_label inner join '.$GLOBALS['prefix'].'label on id = id_son WHERE `type` = "'.$type.'" AND id_father = '.$this->id.$rightCriteria.' ORDER BY '.$this->childsOrderBy.' '.$this->childsOrder.' LIMIT '.($page*$this->nbChildsPerPage).','.$this->nbChildsPerPage.';';

		if($resultQuery = $this->mysql->query($query))
			while($res = $resultQuery->fetch_assoc()) {
				$_childs[] = new ZzIO($res['id_son']);
			}
		return $_childs;
	}
	
	/**
	 * récupérer les enfant du label dans lesquels on peut écrire
	 * @return array
	 */
	public function getAllWritableChilds($type = null) {
		$_childs = array(); //liste des enfants
		

		//Construction du critère de limitation des droit
			//Si statique, seul les enfants avec droit en lectures pour tous
			if($GLOBALS['isStatic'])
				$rightCriteria = ' AND otherW = 1';
			//Si dynamique 
			else {
				if(!empty($_SESSION['group']))
					foreach($_SESSION['group'] AS $key => $grp)
						if($key == 0)
							$listGroup = $grp;
						else
							$listGroup .= '|'.$grp;
				else
					$listGroup = '0';
				if(!empty($_SESSION['user']))
					$user = $_SESSION['user'];
				else
					$user = '0';
				$rightCriteria = ' AND ((OtherW=1) OR (GroupW = 1 AND Group REGEXP \'^'.$listGroup.'$\') OR (UserW = 1 AND User = '.$user.')';
			}
		
		//Si $type est null, on récupère tout les enfants
		if($type == null)
			$query = 'SELECT id_son FROM '.$GLOBALS['prefix'].'_label inner join '.$GLOBALS['prefix'].'label on id = id_son WHERE id_father = '.$this->id.$rightCriteria.' ORDER BY '.$this->childsOrderBy.' '.$this->childsOrder;
		else
			$query = 'SELECT id_son FROM '.$GLOBALS['prefix'].'_label inner join '.$GLOBALS['prefix'].'label on id = id_son WHERE `type` = "'.$type.'" AND id_father = '.$this->id.$rightCriteria.' ORDER BY '.$this->childsOrderBy.' '.$this->childsOrder;
		if($resultQuery = $this->mysql->query($query))
			while($res = $resultQuery->fetch_assoc()) {
				$_childs[] = new ZzIO($res['id_son']);
			}
		return $_childs;
	}
	/**
	 * récupérer les enfant du label dans lesquels on peut écrire
	 * @return array
	 */
	public function getWritableChilds($type = null) {
		$_childs = array(); //liste des enfants
		
		//Numéro de la page
			$page = 0;
			if(!empty($_GET['page']) > 0)
				$page = intval($_GET['page']);

		//Construction du critère de limitation des droit
			//Si statique, seul les enfants avec droit en lectures pour tous
			if($GLOBALS['isStatic'])
				$rightCriteria = ' AND otherW = 1';
			//Si dynamique 
			else {
				if(!empty($_SESSION['group']))
					foreach($_SESSION['group'] AS $key => $grp)
						if($key == 0)
							$listGroup = $grp;
						else
							$listGroup .= '|'.$grp;
				else
					$listGroup = '0';
				if(!empty($_SESSION['user']))
					$user = $_SESSION['user'];
				else
					$user = '0';
				$rightCriteria = ' AND ((OtherW=1) OR (GroupW = 1 AND Group REGEXP \'^'.$listGroup.'$\') OR (UserW = 1 AND User = '.$user.')';
			}

		//Si $type est null, on récupère tout les enfants
		if($type == null)
			$query = 'SELECT id_son FROM '.$GLOBALS['prefix'].'_label inner join '.$GLOBALS['prefix'].'label on id = id_son WHERE id_father = '.$this->id.$rightCriteria.' ORDER BY '.$this->childsOrderBy.' '.$this->childsOrder.' LIMIT '.($page*$this->nbChildsPerPage).','.$this->nbChildsPerPage.';';
		else
			$query = 'SELECT id_son FROM '.$GLOBALS['prefix'].'_label inner join '.$GLOBALS['prefix'].'label on id = id_son WHERE `type` = "'.$type.'" AND id_father = '.$this->id.$rightCriteria.' ORDER BY '.$this->childsOrderBy.' '.$this->childsOrder.' LIMIT '.($page*$this->nbChildsPerPage).','.$this->nbChildsPerPage.';';

		if($resultQuery = $this->mysql->query($query))
			while($res = $resultQuery->fetch_assoc()) {
				$_childs[] = new ZzIO($res['id_son']);
			}
		return $_childs;
	}
	
	/**
	 * génrère la liste des pages
	 * @return string
	 */
	public function getListPage($type = null) {
		$str = ''; //liste des pages
		$nbChilds = 0; //nombre d'enfants
		$nbPages = 0; //Nombre de pages
		
		//Numéro de la page
			$page = 0;
			if(!empty($_GET['page']) > 0)
				$page = intval($_GET['page']);
				
		//Construction du critère de limitation des droit
			//Si statique, seul les enfants avec droit en lectures pour tous
			if($GLOBALS['isStatic'])
				$rightCriteria = ' AND otherR = 1';
			//Si dynamique 
			else {
				if(!empty($_SESSION['group']))
					foreach($_SESSION['group'] AS $key => $grp)
						if($key == 0)
							$listGroup = $grp;
						else
							$listGroup .= '|'.$grp;
				else
					$listGroup = '0';
				if(!empty($_SESSION['user']))
					$user = $_SESSION['user'];
				else
					$user = '0';
				$rightCriteria = ' AND ((OtherW=1) OR (GroupW = 1 AND Group REGEXP \'^'.$listGroup.'$\') OR (UserW = 1 AND User = '.$user.')';
			}


		//Si $type est null, on récupère tout les enfants
		if($type == null)
			$query = 'SELECT COUNT(*) as count FROM '.$GLOBALS['prefix'].'_label inner join '.$GLOBALS['prefix'].'label on id = id_son WHERE id_father = '.$this->id.$rightCriteria.';';
		else
			$query = 'SELECT COUNT(*) as count FROM '.$GLOBALS['prefix'].'_label inner join '.$GLOBALS['prefix'].'label on id = id_son WHERE `type` = "'.$type.'" AND id_father = '.$this->id.$rightCriteria.';';
		if($resultQuery = $this->mysql->query($query))
			if($res = $resultQuery->fetch_assoc())
				$nbChilds = $res['count'];
				
		$nbPages = $nbChilds / $this->nbChildsPerPage;
		
		for($i=0; $i<$nbPages;$i++) {
			if($i == $page)
				$str .= '
		<a href="'.getUrl('page',$i).'" class="selected">'.($i+1).'</a>';
			else
				$str .= '
		<a href="'.getUrl('page',$i).'">'.($i+1).'</a>';
		
		}
		if($nbPages>1)
			return '
	<div class="pagination">'.$this->trDom->tr('Page').':'.$str.'
	</div>';
		else
			return '
	<div class="pagination"></div>';
	}
	
	/**
	 * Défini le nombre d'enfants par page
	 * @return void
	 */
	public function setNbChildsPerPage($nbChildsPerPage) {
		$this->nbChildsPerPage = $nbChildsPerPage;
	}
	
	/**
	 * Défini le critaire d'ordonancement des enfants
	 * @return void
	 */
	public function setChildsOrderBy($childsOrderBy) {
		$this->childsOrderBy = $childsOrderBy;
	}
	
		/**
	 * Inverse l'ordre d'ordonancement des enfant
	 * @return void
	 */
	public function reverseChildsOrder() {
		if($this->childsOrder == 'ASC')
			$this->childsOrder = 'DESC';
		else
			$this->childsOrder = 'ASC';
	}
	
	/**
	 * Ajoute le droit de création d'enfant pour tout le monde
	 */
	public function allowEbToCreateChilds($type) {
		$this->createChilds[$type]['user'] = 1;
		$this->createChilds[$type]['group'] = $this->_labelDomTypes['group']->value;
		$this->createChilds[$type]['other'] = 1;
	}
	/**
	 * Retire le droit de création d'enfant pour tout le monde
	 */
	public function allowNbToCreateChilds($type) {
		$this->createChilds[$type]['user'] = 0;
		$this->createChilds[$type]['group'] = 0;
		$this->createChilds[$type]['other'] = 0;
	}
	/**
	 * Ajoute le droit de création d'enfant pour l'utilisateur
	 */
	public function allowUserToCreateChilds($type) {
		$this->createChilds[$type]['user'] = 1;
	}
	/**
	 * Ajoute le droit de création d'enfant pour le groupe
	 */
	public function allowGroupToCreateChilds($type,$group=null) {
		if($group == null)
			$group = $this->_labelDomTypes['group']->value;
		$this->createChilds[$type]['group'] = $group;
	}
	/**
	 * Retire le droit de création d'enfant pour l'utilisateur
	 */
	public function dontAllowUserToCreateChilds($type) {
		$this->createChilds[$type]['user']= 0;
	}
	/**
	 * Retire le droit de création d'enfant pour le groupe
	 */
	public function dontAllowGroupToCreateChilds($type) {
		$this->createChilds[$type]['group'] = 0;
	}
	/**
	 * Retire le droit de création d'enfant pour les autres
	 */
	public function dontAllowOtherToCreateChilds($type) {
		$this->createChilds[$type]['group'] = 0;
	}
	/**
	 * Récupère les type d'enfants que l'on peut creer
	 */
	public function getAutoCreateChildsPermissions() {
		if(!is_null($this->_autocreateChildsPermissions))
			return $this->_autocreateChildsPermissions;
		
		$this->_autocreateChildsPermissions = array();
		
		if($GLOBALS['isStatic']) {
			$ssreq = '( A.other = 1 )';
		}
		else {
			//En premier on transforme le tableau group en regex
				if(!empty($_SESSION['group']))
					foreach($_SESSION['group'] AS $key => $grp)
						if($key == 0)
							$listGroup = $grp;
						else
							$listGroup .= '|'.$grp;
				else
					$listGroup = '';

			//L'id de l'utilisateur
				if(!empty($_SESSION['user']))
					$user = $_SESSION['user'];
				else
					$user = '0';
			
			//Si $user = 0, alors la requête ne regarde que les le champs "other"
				if($user == 0)
					$ssreq = '( other = 1 )';
			//Si on vérifie tous le groupe et l'utilisateur
				elseif($this->_labelDomTypes['user']->value == $user)
					$ssreq = '( other = 1 OR `group` REGEXP \'^'.$listGroup.'$\' OR user = 1 )';
				else
					$ssreq = '( other = 1 OR `group` REGEXP \'^'.$listGroup.'$\' )';
		}
		$req = 'SELECT type FROM '.$GLOBALS['prefix'].'_autocreate_childs_permissions WHERE id = \''.$this->id.'\' AND '.$ssreq.' ;';
		if($resultQuery = $this->mysql->query($req));
			while($result = $resultQuery->fetch_assoc())
				$this->_autocreateChildsPermissions[] = $result['type'];
		
		return $this->_autocreateChildsPermissions;
	}
	
	/**
	 * Ajouter un parent
	 */
	public function addParent($lid) {
		if(!array_search($lid,$this->_parentsToAdd))
			$this->_parentsToAdd[] = $lid;
	}
	/**
	 * Enlève un parent
	 */
	public function unlinkParent($lid) {
		if(!array_search($lid,$this->_parentsToUnlink))
			$this->_parentsToUnlink[] = $lid;
	}
	
	/**
	 * Supprimme le label
	 * @return	bool	true en cas de réussite, false dans le cas contraire
	 */
	public function rm() {
		
		//On verifie qu'on peux supprimer l'article
		if(empty($_SESSION['id'])) {
			if($this->_labelDomTypes['otherW']->value = '0')
				return false;
		}
		elseif($this->_labelDomTypes['otherW']->value = '0' and !array_search($this->_labelDomTypes['groupW']->value,$_SESSION['group']) and $this->_labelDomTypes['userW']->value != $_SESSION['id'])
			return false;
		
		//On verifie qu'on a pas d'enfant
			$nbChilds = 0;
			if($req = $this->mysql->query('SELECT count(*) as count FROM '.$GLOBALS['prefix'].'_label WHERE id_father = '.$this->id))
				if($res = $req->fetch_assoc())
					$nbChilds = $res['count'];
			if($nbChilds > 0)
				return false;
		
		//On récupère les parents
		$_parents = array();
		if($req = $this->mysql->query('SELECT id_father FROM '.$GLOBALS['prefix'].'_label WHERE id_son = '.$this->id))
			while($res = $req->fetch_assoc())
				$_parents[] = $res['id_father'];
		//On supprime les liens avec les parents
			include_once $GLOBALS['cwd'].'/ZzL/manageParentsLabel.php';
			if(unlinkParents($this->id,$this->_labelDomTypes['type']->value,$_parents,true) === false)
				return false;
		
		//On supprime le label
			if(!$this->mysql->query('DELETE FROM '.$GLOBALS['prefix'].'label WHERE id = '.$this->id))
				return false;
			if(!$this->mysql->query('DELETE FROM '.$this->tableName.' WHERE id = '.$this->id))
				return false;

		foreach(explode('-',$_GET['label']) as $label)
			if($label != $this->id) {
				if(isSet($labelList))
					$labelList .= '-'.$label;
				else
					$labelList = $label;
			}
			if(!isSet($labelList))
				$labelList = '1';
		echo '
		<script language="javascript">
			document.location.href="index.php?label='.$labelList.'";
		</script>';
		
		return true;
	}
	
	
	
	/**
	 * Verifie l'integrité des données collecté, et les enregistre sur la base de données
	 * @return bool Retourne true en cas de réussite, false dans le cas contraire
	 */
	private function commit($param = 'EXECQUERY') {
		//On suppose qu'il n'y a pas d'erreur
		$error = false;
		$_values = array();
		if($this->id == null) {
			$query = 'INSERT INTO `'.$this->tableName.'` ';
			$queryKey = '';
			$queryVal = '';
		}
		else
			$query = 'UPDATE `'.$this->tableName.'` SET ';
		foreach($this->_needs as $key) {
			//Si ce n'est pas un champs de label
			if(!in_array($key,array('name','dateC','dateU','user','group','type','id')))
				$item = $this->domain->$key;
			else
				$item = $this->_labelDomTypes[$key];
			//Si le post n'existe pas
			if((!isSet($_POST[$key]) or $_POST[$key] == '') and $item->nullable == false) {
				$error = true;
				$GLOBALS['errors'][$key] = $this->tr->tr('notNull');
			}
			//Si valeur refusé
				//Par le domType
				if(!$item->setValue($_POST[$key])) {
					$error = true;
				}
				//Par la domaine
				if(method_exists($this->domainName,'check'.$key) and !$this->domain->{'check'.$key}())
					$error = true;
			if(!in_array($key,array('name','dateC','dateU','user','group','type','id')))
				$_values[$key] = mysql_escape_string($item->value);
			
		}

		//Si pas d'erreur on enregistre
		if($error) {
			return false;
		}
		if($param == 'EXECQUERY') {
			include_once $GLOBALS['cwd'].'/ZzL/manageLabel.php';
			$first = true;
			foreach($_values as $key => $val) {
				if($this->domain->$key->quoted)
					$value = "'$val'";
				else
					$value = $val;
				if($this->id == null) {
					if(!$first) {
						$queryKey .= ', `'.$key.'`';
						$queryVal .= ', '.$value;
					}
					else {
						$queryKey .= '`'.$key.'`';
						$queryVal .= $value;
					}
				}
				else {
					if(!$first) {
						$query .= ', ';
					}
					$query .= '`'.$key.'` = '.$value;
				}
				$first = false;
			}
			if($this->id == null) {
				$getId = ZzCreateLabel($this->_labelDomTypes['name']->value,$this->_labelDomTypes['type']->value,$this->_labelDomTypes['dateC']->value,$this->_labelDomTypes['user']->value,$this->_labelDomTypes['group']->value,$this->_labelDomTypes['chmod']->value,array($this->_labelDomTypes['parentLabel']->value));
				if($getId === false)
					$error = true;
				else
					$_SESSION['tmpId'.$GLOBALS['tmpId']] = $getId;
				$query = $query.' (`id`, '.$queryKey.') VALUES('.$getId.' ,'.$queryVal.')';
			}
			else {
				if(!ZzUpdateLabel($this->id,$this->_labelDomTypes['name']->value,$this->_labelDomTypes['dateC']->value,$this->_labelDomTypes['parentLabel']->value))
					$error = true;
				$query .= ' WHERE id='.$this->id;
				$getId = $this->id;
			}

		if($error === true)
			return false;

		if(count($_values) != 0)
			if(!$this->mysql->query($query))
				return false;
		
		require_once $GLOBALS['cwd'].'/ZzL/setAutoCreateChildsPermissions.php';
		foreach($this->createChilds as $type => $val) 
			setAutoCreateChildsPermissions($getId,$type,@$val['user'],@$val['group'],@$val['other']);
		
		if(!empty($this->_parentsToAdd) or !empty($this->_parentsToUnlink)) {
			include_once $GLOBALS['cwd'].'/ZzL/manageParentsLabel.php';
			if(!empty($this->_parentsToAdd))
				addParents($getId,$this->_labelDomTypes['type']->value,$this->_parentsToAdd);
			if(!empty($this->_parentsToUnlink))
				unlinkParents($getId,$this->_labelDomTypes['type']->value,$this->_parentsToUnlink);
			
		}
		
		$labelList = $getId;
		foreach(explode('-',$_GET['label']) as $label)
			if(is_numeric($label) and $label != $getId)
				$labelList .= '-'.$label;
		echo '
		<script language="javascript">
			document.location.href="index.php?label='.$labelList.'";
		</script>';
		
		}
		return true;
	}
	
	/**
	 * Informe si un enregistrement est possible
	 * @return bool Retourn false si l'enregistrement est possible, true dans le cas contraire
	 */
	public function isNotCommitable() {
		if(empty($_POST['IOForm'.$this->id]))
			return false;
		else
			return !$this->commit('DONTEXECQUERY'); 
	}
	
	/**
	 * Effectue les enregistrements éventuels
	 */
	public function __destruct() {
		if(!empty($_POST['IOForm'.$this->id]))
			$this->commit();
	}
}

/**
* Renvoie l'identifiant du premeir goupe trouvé portant le nom $groupName. Si ce dernier n'existe pas alors le groupe est crée
* @param string $groupName nom du groupe
* @return int l'identifiant du groupe
*/
function getGroupId($groupName) {
	//l'objet mysqli
		$mysql = $GLOBALS['MySql'];
	//On recherche le groupe
		if($_results = $mysql->query('SELECT id from '.$GLOBALS['prefix'].'group WHERE name = "'.$groupName.'"'))
			if($_result = $_results->fetch_assoc())
				return $_result['id'];
			
	//On creer le groupe
		if($mysql->query('INSERT INTO '.$GLOBALS['prefix'].'group(name) VALUE("'.$groupName.'")'))
			return $mysql->insert_id;
	
	//Il y'a eu des problèmes
		return false;
}

/**
* Ajoute un utilisateur à un groupe
* @param int $idUser identifiant de l'utilisateur
* @param int $idGroup identifiant du groupe
* @return bool false en cas de problème
*/
function addGroup($idUser, $idGroup) {
	//Verification des paramètres
	if(!is_numeric($idGroup) or !is_numeric($idUser))
		return false;
	
	//l'objet mysqli
		$mysql = $GLOBALS['MySql'];
	
	//On recupère le tableau des groupes
	if($GLOBALS['storeGroupsInFiles']) {
		if(file_exists($GLOBALS['cwd'].'/ZzGroup/'.$idUser.'.php'))
			include $GLOBALS['cwd'].'/ZzGroup/'.$idUser.'.php';
		else
			$_groups = array();

		if(array_search($idGroup, $_groups) === false) {
			$_groups[] = $idGroup;
			
			//On écrit le fichier
				if(!file_put_contents($GLOBALS['cwd'].'/ZzGroup/'.$idUser.'.php','<?php '.arrayToString($_groups,'_groups').'?>'))
					return false;
		}
		else
			return false;
	}
	
	//On enregistre la donnée dans la base
	if(!$mysql->query('INSERT INTO '.$GLOBALS['prefix'].'_groupuser(id_group, id_user) VALUE('.$idGroup.','.$idUser.')'))
		return false;
		
	//Tout est ok, on retourne true
		return true;
}

/**
* Supprime un utilisateur d'un groupe
* @param int $idUser identifiant de l'utilisateur
* @param int $idGroup identifiant du groupe
* @return bool false en cas de problème
*/
function rmGroup($idUser, $idGroup) {
	//Verification des paramètres
	if(!is_numeric($idGroup) or !is_numeric($idUser))
		return false;
	
	//l'objet mysqli
		$mysql = $GLOBALS['MySql'];
		
	//On recupère le tableau des groupes
	if($GLOBALS['storeGroupsInFiles']) {
		if(file_exists($GLOBALS['cwd'].'/ZzGroup/'.$idUser.'.php'))
			include $GLOBALS['cwd'].'/ZzGroup/'.$idUser.'.php';
		else
			$_groups = array();
			
		if(is_int($key = array_search($idGroup, $_groups))) {
			unSet($_groups[$key]);
			
		//On écrit le fichier
			if(!file_put_contents($GLOBALS['cwd'].'/ZzGroup/'.$idUser.'.php','<?php '.arrayToString($_groups,'_groups').'?>'))
				return false;
		}
		else
			return false;
	}
	
	//On enregistre la donnée dans la base
	if(!$mysql->query('DELETE FROM '.$GLOBALS['prefix'].'_groupuser WHERE id_group = '.$idGroup.' AND id_user = '.$idUser))
		return false;
		
	//Tout est ok, on retourne true
		return true;
}

function arrayToString($_array,$arrayName) {
	$string = '$'.$arrayName.' = array(';
	$first = true;
	foreach($_array as $key => $value) {
		if(!is_numeric($key))
			$key = '\''.$key.'\'';
		if(!is_numeric($value))
			$value = '\''.$value.'\'';
		if(!$first)
			$string .= ',';
		$string .= $key.' => '.$value;
		$first = false;
	}
	return $string.');';
}
?>